查看原文
其他

让新来的改一段C代码,看到结果后差点气死!

The following article is from 玩转单片机与嵌入式 Author 风雨无阻

一、事情起因

事情的起因是这样的:原来的产品已经有比较成熟代码,并且产品已经批量。客户提出了新的功能改动,需要将其中一个端口的功能与另一个端口互换,原来做AI采集的端口用作开关量采集,原来用作开关量采集的端口用作AI采集。
这么小的代码改动,想着让新来的小伙子尝试一下,就放心地让他去改。等两天后询问进度,本来以为已经完成的工作,竟然被告知代码测试还有问题。
抽出来时间跟他一起检查了代码。当我看到下面的改动之后,瞬间崩溃了。
原来的代码是这样的:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOA, &GPIO_InitStructure);

改动后的代码是这样的:

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; \   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);
乍一看好像没有什么问题,将原来PA9的AI模式配置注释掉,修改为上拉输入模式,将原来AI10的上拉输入模式修改为AI模式。
当我将代码用vscode打开后,发现第204行与205行的颜色相同。如下图所示:
原来是不小心在第204行最后输入了一个“\”,这个“\”在C语言中是换行标记,使用这个符号时,就导致第205行其实是被注释掉的。相当于PA9的模式一直没有设置成功。
当我问他为什么要在最后增加一个“\”的时候,他说:“不知道,不过这个已经被注释了,也不影响啊!”。
我的内心在想,“你是C语言之父啊,你说没影响就没影响了?”。不过作为导师,还是耐着性子给他讲解了“\”在C语言中的用法。

二、总结

在C语言程序编写中,我们有时会遇到一行代码太长而影响阅读或者出现与部分公司或组织要求的编码规范不符的情况,此时我们需要将这行代码分成多行来写。

针对一般语句,我们使用\结尾作为换行标记。当在编译时,\后面的换行符将被忽略,当做一行处理。

所以上面的语句:

//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; \   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

在编译时的实际效果会这样的:

//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
所以下面一行配置端口为“上拉输入”模式的代码其实是被注释掉,不被编译进去的。
你也遇到过类似的问题吗?欢迎来评论区留言讨论。

END

来源:玩转单片机与嵌入式

版权归原作者所有,如有侵权,请联系删除。

推荐阅读
嵌入式软件分层隔离的典范
是他把Linux系统带回了中国
嵌入式中状态机的几种骚操作

→点关注,不迷路←

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存